iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0
AI & Data

量化交易30天系列 第 17

量化交易30天 Day17 - 串接券商API做交易(四) 台股下單

  • 分享至 

  • xImage
  •  

量化交易30天
本系列文章是紀錄一位量化交易新手的學習過程,除了基礎的Python語法不說明,其他金融相關的東西都會一步步地說明,希望讓更多想學習量化交易但是沒有學過相關金融知識的朋友們,透過這系列的文章,能夠對量化交易略知一二,也歡迎量化交易的高手們多多交流。

上一篇介紹如何獲得盤中即時數據之後,就可以把盤中數據丟到交易策略裡面運算,如果有產生交易訊號的話,就可以下單了,這篇就要來練習用shioaji API下單。(記得要先用api登入跟載入憑證喔,可以先看Day16)

1. 交易商品

# contract,這邊用台積電作為範例
contract = api.Contracts.Stocks.TSE.TSE2330

2. 如何設定買單

設定想要買進的價格、數量、下單方式...等等,相關的參數可以看document。

order = api.Order(price=439, 
                  quantity=1, 
                  action="Buy", 
                  price_type="LMT", 
                  order_type="ROD", 
                  order_lot="Common", 
                  account=api.stock_account
                  )

3. 如何設定賣單

賣單的話,action的部份會是Sell,參數也都可以調整。

order = api.Order(price=450, 
                  quantity=1, 
                  action="Sell", 
                  price_type="LMT", 
                  order_type="ROD", 
                  order_lot="Common", 
                  account=api.stock_account
                  )

P.S.執行order後,只是先寫好交易委託單,但是還沒有把這個委託單送出去給券商喔!

4. 送出委託單

要執行這個步驟,才算是把委託單送出去!要小心,在盤中執行的話,就真的是下單出去了,是有可能會成交的,建議可以先掛一個不太容易成交的價格試試看。

trade = api.place_order(contract, order)

從API登入到完成委託 - 完整程式碼

這邊以買進1單位台積電,限價400元,當日有效單(ROD),以張為交易單位(Common)作為範例。

# API initialization
import shioaji as sj
import json
api = sj.Shioaji(backend='https', simulation=False)

# login
with open('login.txt', 'r') as f:
    kw_login = json.loads(f.read())  
    api.login(**kw_login)

# activate ca
person_id = kw_login['person_id']  
api.activate_ca(ca_path='./Sinopac.pfx', ca_passwd=person_id, person_id=person_id)

contract = api.Contracts.Stocks.TSE.TSE2330
order = api.Order(price=400, 
                  quantity=1, 
                  action="Buy", 
                  price_type="LMT", 
                  order_type="ROD", 
                  order_lot="Common", 
                  account=api.stock_account
                  )
trade = api.place_order(contract, order)
trade

Output

Trade(contract=Stock(exchange=<Exchange.TSE: 'TSE'>, code='2330', symbol='TSE2330', name='台積電', category='24', limit_up=484.0, limit_down=396.0, reference=440.0, update_date='2020/09/22', margin_trading_balance=1545, short_selling_balance=192, day_trade=<DayTrade.Yes: 'Yes'>), order=Order(action=<Action.Buy: 'Buy'>, price=400, quantity=1, id='xxxxxxx', seqno='xxxxxx', ordno='xxxxx', account=Account(account_type=<AccountType.Stock: 'S'>, person_id='xxxxxxxxxx', broker_id='xxxx', account_id='xxxxxxx', signed=True), price_type=<StockPriceType.LMT: 'LMT'>, order_type=<FuturesOrderType.ROD: 'ROD'>), status=OrderStatus(id='xxxxxxxx', status=<Status.PendingSubmit: 'PendingSubmit'>, status_code='0', order_datetime=datetime.datetime(2020, 9, 22, 13, 23, 13), deals=[]))

取消委託

api.update_status(api.stock_account)
api.cancel_order(trade)
api.update_status(api.stock_account)
trade

Output

OrderState.TFTOrder {'operation': {'op_type': 'Cancel', 'op_code': '88', 'op_msg': '委託數量已完全刪除'}, 'order': {'id': 'xxxxxxxx', 'seqno': 'xxxxxx', 'ordno': 'xxxxx', 'action': 'Buy', 'price': 400.0, 'quantity': 1, 'order_cond': 'Cash', 'order_type': 'ROD', 'price_type': 'LMT'}, 'status': {'id': 'xxxxxxxx', 'exchange_ts': 1600752223, 'modified_price': 0, 'cancel_quantity': 0}, 'contract': {'security_type': 'STK', 'exchange': 'TSE', 'code': '2330', 'symbol': '', 'name': '', 'currency': 'TWD'}}

Trade(contract=Stock(exchange=<Exchange.TSE: 'TSE'>, code='2330', symbol='TSE2330', name='台積電', category='24', limit_up=484.0, limit_down=396.0, reference=440.0, update_date='2020/09/22', margin_trading_balance=1545, short_selling_balance=192, day_trade=<DayTrade.Yes: 'Yes'>), order=Order(action=<Action.Buy: 'Buy'>, price=400.0, quantity=1, id='xxxxxxxx', seqno='xxxxxx', ordno='xxxxx', account=Account(account_type=<AccountType.Stock: 'S'>, person_id='xxxxxxxxxx', broker_id='xxxx', account_id='xxxxxxx', signed=True), price_type=<StockPriceType.LMT: 'LMT'>, order_type=<FuturesOrderType.ROD: 'ROD'>), status=OrderStatus(id='bffb6bbb', status=<Status.Cancelled: 'Cancelled'>, status_code='00', order_datetime=datetime.datetime(2020, 9, 22, 11, 56, 31), cancel_quantity=1, deals=[]))

本篇總結
這篇就大致上介紹如何用API下單,可以看到server回應的訊息還蠻多的,需要仔細去讀一下,不過因為不會太難,直接看document就可以了,下單功能也學會之後,下一篇文章會來練習怎麼使用API查帳戶狀況,這也是相當重要的功能喔,請繼續收看吧!

P.S.
如果大家對於量化交易有興趣的話,我自己有上過以下這門課,課程內容從串接股市資料API、儲存至資料庫、將自己的策略轉化成程式碼、自動下單,並且可以把整個流程自動化,每天早上執行一次,一整天就不用看盤了,覺得是蠻實戰的,可以參考看看。

筆者 Sean
奈米戶投資人 / Python愛用者
喜歡用Python玩轉金融數據,從個股基本面、技術面、籌碼面相關資料,一直到總體經濟數據,都是平常接觸到的素材;對於投資,除了研究歷史數據,也喜歡瞭解市場上大家在玩些什麼。


上一篇
量化交易30天 Day16 - 串接券商API做交易(三) 台股盤中即時資料
下一篇
量化交易30天 Day18 - 串接券商API做交易(五) 使用API查帳戶概況
系列文
量化交易30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言